# = StarFrame -- StarRuby用フレームワーク
# StarRubyにシーン管理やスプライトなどの機能を追加する。

require "starruby"
$LOAD_PATH << File.dirname(__FILE__)
require "starframe/scene"
require "starframe/sprite"
require "starframe/image"

# = StarFrameモジュール
# StarFrameで共通して使用するメソッドなどを集めたモジュール。
module StarFrame
  module_function
  def start options = {}
    width  = options.delete(:width)  || 640
    height = options.delete(:height) || 480
    
    first_scene = options.delete(:scene) || MainScene
    
    game = StarRuby::Game.new width, height, options
    begin
      scene = first_scene.new(game)
      while scene
        scene = scene.start
      end
    ensure
      game.dispose
    end
  end
end

class String
  # 文字列のキャメライズを行う。
  # 
  # キャメライズは以下のルールで行われる。
  # * アンダーバー、ハイフン、スペースを文字の区切りとする。
  # * パスをネームスペースの区切りとする。
  def camelize
    self.split("/").map{ |file|
      file.split(/[_\-\s]+/).map(&:capitalize).join
    }.join("::")
  end
end

class Integer
  # 0からselfの直前まで、直線的に値を変化させた配列を返す。
  # 
  #   10.linear     #=> [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
  def linear
    Array.new(self){ |i| i.to_f }
  end
  
  # 0からselfの直前まで、二次関数的に値を加速させた配列を返す。
  # 
  #   10.accelerate #=> [0.0, 0.1, 0.4, 0.9, 1.6, 2.5, 3.6, 4.9, 6.4, 8.1]
  def accelerate
    Array.new(self){ |i| (i**2).quo self }
  end
  
  # 0からselfの直前まで、二次関数的に値を減速させた配列を返す。
  # 
  #   10.decelerate #=> [0.0, 1.9, 3.6, 5.1, 6.4, 7.5, 8.4, 9.1, 9.6, 9.9]
  def decelerate
    Array.new(self){ |i| self - ((self-i)**2).quo(self) }
  end
end

class Symbol 
  unless defined? to_proc
    def to_proc
      Proc.new{ |obj, *args| obj.send(self, *args) }
    end
  end
end
